package com.ruoyi.tzai.mapper;

import java.util.Date;
import java.util.List;
import com.ruoyi.tzai.domain.TaskQueue;
import org.apache.ibatis.annotations.Param;

/**
 * 任务队列Mapper接口
 * 
 * @author tzai
 * @date 2025-11-12
 */
public interface TaskQueueMapper 
{
    /**
     * 查询任务队列
     * 
     * @param taskId 任务队列主键
     * @return 任务队列
     */
    public TaskQueue selectTaskQueueByTaskId(Long taskId);

    /**
     * 查询任务队列列表
     * 
     * @param taskQueue 任务队列
     * @return 任务队列集合
     */
    public List<TaskQueue> selectTaskQueueList(TaskQueue taskQueue);

    /**
     * 新增任务队列
     * 
     * @param taskQueue 任务队列
     * @return 结果
     */
    public int insertTaskQueue(TaskQueue taskQueue);

    /**
     * 修改任务队列
     * 
     * @param taskQueue 任务队列
     * @return 结果
     */
    public int updateTaskQueue(TaskQueue taskQueue);

    /**
     * 删除任务队列
     * 
     * @param taskId 任务队列主键
     * @return 结果
     */
    public int deleteTaskQueueByTaskId(Long taskId);

    /**
     * 批量删除任务队列
     * 
     * @param taskIds 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteTaskQueueByTaskIds(Long[] taskIds);

    /**
     * 查询中断的任务(用于启动时恢复)
     * 
     * @return 任务队列集合
     */
    public List<TaskQueue> selectInterruptedTasks();

    /**
     * 查询待处理的任务(按优先级排序)
     * 
     * @param limit 限制数量
     * @return 任务队列集合
     */
    public List<TaskQueue> selectPendingTasks(@Param("limit") int limit);

    /**
     * 查询需要清理的任务
     * 
     * @param statuses 状态列表
     * @param beforeDate 完成时间早于
     * @return 任务队列集合
     */
    public List<TaskQueue> selectTasksNeedCleanup(@Param("statuses") List<String> statuses, 
                                                    @Param("beforeDate") Date beforeDate);

    /**
     * 原子性更新任务状态(带乐观锁)
     * 
     * @param taskId 任务ID
     * @param newStatus 新状态
     * @param allowedOldStatuses 允许的旧状态列表
     * @param workerThread 工作线程ID
     * @return 影响行数
     */
    public int updateTaskStatusWithLock(@Param("taskId") Long taskId,
                                       @Param("newStatus") String newStatus,
                                       @Param("allowedOldStatuses") List<String> allowedOldStatuses,
                                       @Param("workerThread") String workerThread);

    /**
     * 根据文章ID查询任务
     * 
     * @param articleId 文章ID
     * @return 任务队列
     */
    public TaskQueue selectTaskQueueByArticleId(Long articleId);

    /**
     * 删除指定时间之前的任务
     * 
     * @param statuses 状态列表
     * @param beforeDate 时间点
     * @return 删除数量
     */
    public int deleteTasksBefore(@Param("statuses") List<String> statuses, 
                                  @Param("beforeDate") Date beforeDate);
}

